package mtt.us.client.views.fachbereich.matrikel.editor;

import mtt.us.client.MTTUS;
import mtt.us.client.events.SetModelDataEvent;
import mtt.us.dto.MatrikelDTO;
import mtt.us.hmvcFramework.client.hmvc.events.DisposeEvent;

import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

import hmvc4gwt.client.event.HmvcEvent;
import hmvc4gwt.client.event.HmvcEventListener;
import hmvc4gwt.client.view.View;

public class MatrikelEditorView extends View  implements HmvcEventListener {

	/**
	 * Button "Abbrechen"
	 */
	private Button buttonCancel = new Button();
	
	/**
	 * Button "Löschen"
	 */
	private Button buttonDelete; 
	
	/**
	 * Button "Speichern"
	 */
	private Button buttonSave = new Button();
	
	/**
	 * enthält den Fachbereich der Editiert werden soll
	 */
	private MatrikelDTO matrikel;
	
	/**
	 * enthält alle Elemente
	 */
	FlexTable table = new FlexTable();
	
	/**
	 * enthält den Namen
	 */
	private TextBox textBoxName = new TextBox();
	
	/**
	 * fügt bei vorhandenem Fachbereich den Delete-Button hinzu
	 */
	private void addDeleteButton() {
		/*
		 * Button erzeugen, da er nicht immer gebraucht wird
		 */
		buttonDelete = new Button();
		buttonDelete.setText(MTTUS.constants.button_delete());
		
		/*
		 * Listener zum löschen hinzufügen
		 */
		buttonDelete.addClickListener(new ClickListener() {
			
			public void onClick(Widget sender) {
				if (getMatrikel().deleteMatrikel()) {
					getController().fireLocalEvent(new DisposeEvent());
				}
			}
		});
		
		/*
		 * Button zu Tabelle hinzufügen
		 */
		table.setWidget(4, 1, buttonDelete);
	}
	
	public void doInit() {
		/*
		 * Button-Namen setzen 
		 */
		buttonSave.setText(MTTUS.constants.button_save());
		buttonCancel.setText(MTTUS.constants.button_cancel());
		
		/*
		 * Listener hinzufügen
		 */
		buttonSave.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				MatrikelDTO matrikel = getMatrikel();
				
				if (matrikel.storeMatrikel()) {
					// TODO: Matrikel gespeichert anzeigen
				}
			}
		});
		
		buttonCancel.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				
				/*
				 * leeren MatrikelEditor anzeigen
				 */
				getController().fireLocalEvent(new DisposeEvent());
				
			}
		});
		
		/*
		 * Name
		 */
		table.setText(1, 0, MTTUS.constants.text_name());
		table.setWidget(1, 1, textBoxName);
		
		/*
		 * Buttons hinzufügen
		 */
		table.setWidget(3, 0, buttonSave);
		table.setWidget(3, 1, buttonCancel);
		
		/* 
		 * Listener registrieren
		 */
		getController().register(SetModelDataEvent.class, this);
	}
	
	private MatrikelDTO getMatrikel() {
		
		if (this.matrikel == null) {
			MatrikelDTO newMatrikel = new MatrikelDTO();
			this.matrikel = newMatrikel;
		} 
		
		matrikel.setName(textBoxName.getText());
		
		return matrikel;
	}
	
	public Widget getWidget() {
		return table;
	}
	
	public void handleEvent(HmvcEvent event) {
		
		if (event instanceof SetModelDataEvent) {
			SetModelDataEvent setModelDataEvent = (SetModelDataEvent) event;
			
			refreshView((MatrikelDTO) setModelDataEvent.getPayload());
		}
	}

	/**
	 * aktualisiert die View
	 */
	private void refreshView(MatrikelDTO matrikel) {
		if (matrikel == null) {
			return;
		}
		
		setMatrikel(matrikel);
		
		textBoxName.setText(matrikel.getName());
	}

	private void setMatrikel(MatrikelDTO matrikel) {
		
		this.matrikel = matrikel;
		
		addDeleteButton();
	}

	
}
